home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI3 / LEZIONE7i.s < prev    next >
Text File  |  1994-11-28  |  10KB  |  277 lines

  1.  
  2. ; Lezione7i.s    SCORRIMENTO ORIZZONTALE DI UNO SPRITE A PASSI DI 1 PIXEL ALLA
  3. ;        VOLTA ANZICHE' DI 2 PIXEL ALLA VOLTA. IN QUESTO MODO LO SCROLL
  4. ;        NON VA PIU' A SCATTI.
  5.  
  6.  
  7.     SECTION    CiriCop,CODE
  8.  
  9. Inizio:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Nome lib
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  17.  
  18. ;    Puntiamo la PIC "vuota"
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; dove puntare
  21.     LEA    BPLPOINTERS,A1    ; puntatori COP
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.  
  26. ;    Puntiamo lo sprite
  27.  
  28.     MOVE.L    #MIOSPRITE,d0        ; indirizzo dello sprite in d0
  29.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  30.     move.w    d0,6(a1)
  31.     swap    d0
  32.     move.w    d0,2(a1)
  33.  
  34.     move.l    #COPPERLIST,$dff080    ; nostra COP
  35.     move.w    d0,$dff088        ; START COP
  36.     move.w    #0,$dff1fc        ; NO AGA!
  37.     move.w    #$c00,$dff106        ; NO AGA!
  38.  
  39. mouse:
  40.     cmpi.b    #$ff,$dff006    ; Linea 255?
  41.     bne.s    mouse
  42.  
  43.     bsr.s    MuoviSpriteX    ; Muovi lo sprite 0 orizzontalmente (FLUIDO)
  44.     bsr.w    MuoviSpriteY    ; Muovi lo sprite 0 verticalmente
  45.  
  46. Aspetta:
  47.     cmpi.b    #$ff,$dff006    ; linea 255?
  48.     beq.s    Aspetta
  49.  
  50.     btst    #6,$bfe001    ; mouse premuto?
  51.     bne.s    mouse
  52.  
  53.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  54.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  55.  
  56.     move.l    4.w,a6
  57.     jsr    -$7e(a6)    ; Enable
  58.     move.l    gfxbase(PC),a1
  59.     jsr    -$19e(a6)    ; Closelibrary
  60.     rts
  61.  
  62. ;    Dati
  63.  
  64. GfxName:
  65.     dc.b    "graphics.library",0,0
  66.  
  67. GfxBase:
  68.     dc.l    0
  69.  
  70. OldCop:
  71.     dc.l    0
  72.  
  73. ; Questa routine sposta  lo sprite agendo sul suo byte HSTART, e sul bit 0 del
  74. ; quarto byte di controllo, ossia sul bit basso del valore di HSTART. In questo
  75. ; modo lo scorrimento orizzontale procede a scatti di 1 pixel anziche' 2, per
  76. ; cui la fluidita' del movimento orizzontale e' raddoppiata e la scattosita'
  77. ; vista negli esempi precedenti scompare. La parte di routine che "trasforma"
  78. ; il valore della cordinata reale in byte hstart+bit basso puo' essere usata
  79. ; in tutti i listati che muovono sprite, tra l'altro con un add.w #128,d0 c'e'
  80. ; gia' l'aggiunta dell'offset dall'inizio del video, per cui il valore da dare
  81. ; alla routine in entrata e' la coordinata X reale dello schermo LOWRES, per
  82. ; cui se mettiamo 0 lo sprite si posiziona al lato sinistro dello schermo, se
  83. ; mettiamo 160 si posiziona al centro, con 320 si posiziona all'ultimo pixel
  84. ; a destra dello schermo.
  85.  
  86. MuoviSpriteX:
  87.     ADDQ.L    #2,TABXPOINT     ; Fai puntare alla word successiva
  88.     MOVE.L    TABXPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  89.                  ; copiato in a0
  90.     CMP.L    #FINETABX-2,A0  ; Siamo all'ultima word della TAB?
  91.     BNE.S    NOBSTARTX    ; non ancora? allora continua
  92.     MOVE.L    #TABX-2,TABXPOINT ; Riparti a puntare dalla prima word-2
  93. NOBSTARTX:
  94.     moveq    #0,d0        ; azzeriamo d0
  95.     MOVE.w    (A0),d0        ; poniamo il valore della tabella in d0
  96.     add.w    #128,D0        ; 128 - per centrare lo sprite.
  97.     btst    #0,D0        ; bit basso della coordinata X azzerato?
  98.     beq.s    BitBassoZERO
  99.     bset    #0,MIOSPRITE+3    ; Settiamo il bit basso di HSTART
  100.     bra.s    PlaceCoords
  101.  
  102. BitBassoZERO:
  103.     bclr    #0,MIOSPRITE+3    ; Azzeriamo il bit basso di HSTART
  104. PlaceCoords:
  105.     lsr.w    #1,D0        ; SHIFTIAMO, ossia spostiamo di 1 bit a destra
  106.                 ; il valore di HSTART, per "trasformarlo" nel
  107.                 ; valore fa porre nel byte HSTART, senza cioe'
  108.                 ; il bit basso.
  109.     move.b    D0,HSTART    ; Poniamo il valore XX nel byte HSTART
  110.     rts
  111.  
  112. TABXPOINT:
  113.     dc.l    TABX-2        ; NOTA: i valori della tabella qua sono word,
  114.  
  115. ; Tabella con coordinate X dello sprite precalcolate. Questa tabella contiene
  116. ; i valori REALI delle coordinate dello schermo, non i valori "dimezzati" per
  117. ; lo scorrimento a scatti di due pixel come abbiamo visto fino ad ora.
  118. ; Essendo i valori possibili piu' di 256, si supera la grandezza di un byte,
  119. ; per cui la tabella e' composta di WORD, le quali possono contenere tali
  120. ; valori. E' la routine "MuoviSpriteX" che si occupa di prelevare la WORD dalla
  121. ; tabella, e di dividere il numero in BIT BASSO per lo scorrimento di 1 pixel
  122. ; anziche' 2, e negli altri 8 bit, che si occupano degli "scatti di 2 pixel",
  123. ; cioe' il byte HSTART che abbiamo usato da solo fino ad ora.
  124. ; Da notare che la posizione X per far entrare lo sprite nella finestra video
  125. ; deve essere compresa tra 0 e 320, cioe' la posizione effettiva all'interno
  126. ; dello schermo, l'offset dall'inizio del video di 128 (cioe' $40*2) viene
  127. ; aggiunto dalla routine.
  128. ; Bisogna ricordarsi anche che lo sprite e' largo 16 pixel e che la
  129. ; coordinata X si riferisce al suo angolo sinistro, per cui se diamo coordinate
  130. ; superiori a 320-16, ossia superiori a 304, lo sprite risultera' parzialmente
  131. ; fuori dallo schermo.
  132. ; Nella tabella infatti ci sono byte non piu' grandi di 304 e non piu'
  133. ; piccoli di zero.
  134.  
  135.  
  136. ; Ecco come ottenere la tabella:
  137.  
  138. ;                        ___304
  139. ; DEST> tabx                       /   \ 152 (304/2)
  140. ; BEG> 0              \___/     0
  141. ; END> 360
  142. ; AMOUNT> 150
  143. ; AMPLITUDE> 304/2 ; ampiezza sia sopra zero che sotto zero, allora
  144.              ; bisogna che faccia meta' sopra zero e meta' sotto,
  145.              ; ossia dividiamo per 2 l'AMPIEZZA
  146. ; YOFFSET> 304/2    ; e spostiamo tutto sopra per trasformare -152 in 0
  147. ; SIZE (B/W/L)> w
  148. ; MULTIPLIER> 1
  149.  
  150. TABX:
  151.     incbin    "xcoordinatok.tab"    ; 150 valori .W
  152. FINETABX:
  153.  
  154. ; Questa routine sposta in alto e in basso lo sprite agendo sui suoi byte
  155. ; VSTART e VSTOP, ossia i byte della sua posizione Y di inizio e fine,
  156. ; immettendoci delle coordinate gia' stabilite nella tabella TABY
  157.  
  158. MuoviSpriteY:
  159.     ADDQ.L    #1,TABYPOINT     ; Fai puntare al byte successivo
  160.     MOVE.L    TABYPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  161.                  ; copiato in a0
  162.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultima longword della TAB?
  163.     BNE.S    NOBSTARTY    ; non ancora? allora continua
  164.     MOVE.L    #TABY-1,TABYPOINT ; Riparti a puntare dal primo byte (-1)
  165. NOBSTARTY:
  166.     moveq    #0,d0        ; Pulisci d0
  167.     MOVE.b    (A0),d0        ; copia il byte dalla tabella in d0
  168.     MOVE.b    d0,VSTART    ; copia il byte in VSTART
  169.     ADD.B    #13,D0        ; Aggiungi la lunghezza dello sprite per
  170.                 ; determinare la posizione finale (VSTOP)
  171.     move.b    d0,VSTOP    ; Muovi il valore giusto in VSTOP
  172.     rts
  173.  
  174. TABYPOINT:
  175.     dc.l    TABY-1        ; NOTA: i valori della tabella qua sono bytes,
  176.                 ; dunque lavoriamo con un ADDQ.L #1,TABYPOINT
  177.                 ; e non #2 come per quando sono word o con #4
  178.                 ; come quando sono longword.
  179.  
  180. ; Tabella con coordinate Y dello sprite precalcolate.
  181. ; Da notare che la posizione Y per far entrare lo sprite nella finestra video
  182. ; deve essere compresa tra $2c e $f2, infatti nella tabella ci sono byte non
  183. ; piu' grandi di $f2 e non piu' piccoli di $2c.
  184.  
  185. TABY:
  186.     dc.b    $8E,$91,$94,$97,$9A,$9D,$A0,$A3,$A6,$A9,$AC,$AF ; ondeggio
  187.     dc.b    $B2,$B4,$B7,$BA,$BD,$BF,$C2,$C5,$C7,$CA,$CC,$CE ; 200 valori
  188.     dc.b    $D1,$D3,$D5,$D7,$D9,$DB,$DD,$DF,$E0,$E2,$E3,$E5
  189.     dc.b    $E6,$E7,$E9,$EA,$EB,$EC,$EC,$ED,$EE,$EE,$EF,$EF
  190.     dc.b    $EF,$EF,$F0,$EF,$EF,$EF,$EF,$EE,$EE,$ED,$EC,$EC
  191.     dc.b    $EB,$EA,$E9,$E7,$E6,$E5,$E3,$E2,$E0,$DF,$DD,$DB
  192.     dc.b    $D9,$D7,$D5,$D3,$D1,$CE,$CC,$CA,$C7,$C5,$C2,$BF
  193.     dc.b    $BD,$BA,$B7,$B4,$B2,$AF,$AC,$A9,$A6,$A3,$A0,$9D
  194.     dc.b    $9A,$97,$94,$91,$8E,$8B,$88,$85,$82,$7F,$7C,$79
  195.     dc.b    $76,$73,$70,$6D,$6A,$68,$65,$62,$5F,$5D,$5A,$57
  196.     dc.b    $55,$52,$50,$4E,$4B,$49,$47,$45,$43,$41,$3F,$3D
  197.     dc.b    $3C,$3A,$39,$37,$36,$35,$33,$32,$31,$30,$30,$2F
  198.     dc.b    $2E,$2E,$2D,$2D,$2D,$2D,$2C,$2D,$2D,$2D,$2D,$2E
  199.     dc.b    $2E,$2F,$30,$30,$31,$32,$33,$35,$36,$37,$39,$3A
  200.     dc.b    $3C,$3D,$3F,$41,$43,$45,$47,$49,$4B,$4E,$50,$52
  201.     dc.b    $55,$57,$5A,$5D,$5F,$62,$65,$68,$6A,$6D,$70,$73
  202.     dc.b    $76,$79,$7C,$7F,$82,$85,$88,$8b
  203. FINETABY:
  204.  
  205.  
  206.     SECTION    GRAPHIC,DATA_C
  207.  
  208. COPPERLIST:
  209. SpritePointers:
  210.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  211.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  212.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  213.     dc.w    $13e,0
  214.  
  215.     dc.w    $8E,$2c81    ; DiwStrt
  216.     dc.w    $90,$2cc1    ; DiwStop
  217.     dc.w    $92,$38        ; DdfStart
  218.     dc.w    $94,$d0        ; DdfStop
  219.     dc.w    $102,0        ; BplCon1
  220.     dc.w    $104,0        ; BplCon2
  221.     dc.w    $108,0        ; Bpl1Mod
  222.     dc.w    $10a,0        ; Bpl2Mod
  223.  
  224.             ; 5432109876543210
  225.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  226.  
  227. BPLPOINTERS:
  228.     dc.w $e0,0,$e2,0    ;primo     bitplane
  229.  
  230.     dc.w    $180,$000    ; color0    ; sfondo nero
  231.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  232.                         ; in questo caso e' vuoto,
  233.                         ; per cui non compare.
  234.  
  235.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  236.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  237.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  238.  
  239.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  240.  
  241.  
  242. ; ************ Ecco lo sprite: OVVIAMENTE deve essere in CHIP RAM! ************
  243.  
  244. MIOSPRITE:        ; lunghezza 13 linee
  245. VSTART:
  246.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  247. HSTART:
  248.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  249. VSTOP:
  250.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  251.     dc.b $00
  252.  dc.w    %0000000000000000,%0000110000110000 ; Formato binario per modifiche
  253.  dc.w    %0000000000000000,%0000011001100000
  254.  dc.w    %0000000000000000,%0000001001000000
  255.  dc.w    %0000000110000000,%0011000110001100 ;BINARIO 00=COLORE 0 (TRASPARENTE)
  256.  dc.w    %0000011111100000,%0110011111100110 ;BINARIO 10=COLORE 1 (ROSSO)
  257.  dc.w    %0000011111100000,%1100100110010011 ;BINARIO 01=COLORE 2 (VERDE)
  258.  dc.w    %0000110110110000,%1111100110011111 ;BINARIO 11=COLORE 3 (GIALLO)
  259.  dc.w    %0000011111100000,%0000011111100000
  260.  dc.w    %0000011111100000,%0001111001111000
  261.  dc.w    %0000001111000000,%0011101111011100
  262.  dc.w    %0000000110000000,%0011000110001100
  263.  dc.w    %0000000000000000,%1111000000001111
  264.  dc.w    %0000000000000000,%1111000000001111
  265.  dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  266.  
  267.  
  268.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  269.                     ; perche' per vedere gli sprite
  270.                     ; e' necessario che ci siano bitplanes
  271.                     ; abilitati
  272. BITPLANE:
  273.     ds.b    40*256        ; bitplane azzerato lowres
  274.  
  275.     end
  276.  
  277.